import T from "ant-design-vue/es/table/Table";
import get from "lodash.get"

export default {
    data() {
        return {
            needTotalList: [],

            selectedRows: [],
            selectedRowKeys: [],

            localLoading: false,
            localDataSource: [],
            localPagination: Object.assign({}, T.props.pagination)
        };
    },
    props: Object.assign({}, T.props, {
        rowKey: {
            type: [String, Function],
            default: 'id'
        },
        data: {
            type: Function,
            required: true
        },
        pageNum: {
            type: Number,
            default: 1
        },
        pageSize: {
            type: Number,
            default: 10
        },
        showSizeChanger: {
            type: Boolean,
            default: true
        },
        showAlertInfo: {
            type: Boolean,
            default: false
        },
        showPagination: {
            default: 'auto'
        }
    }),
    watch: {
        'localPagination.current'(val) {
            this.$router.push({
                name: this.$route.name,
                params: Object.assign({}, this.$route.params, {
                    pageNo: val
                }),
            });
        },
        pageNum(val) {
            Object.assign(this.localPagination, {
                current: val
            });
        },
        pageSize(val) {
            console.log('pageSize:', val)
            Object.assign(this.localPagination, {
                pageSize: val
            });
        },
        showSizeChanger(val) {
            console.log('showSizeChanger', val)
            Object.assign(this.localPagination, {
                showSizeChanger: val
            });
        }
    },
    created() {
        this.localPagination = ['auto', true].includes(this.showPagination) && Object.assign({}, this.localPagination, {
            current: this.pageNum,
            pageSize: this.pageSize,
            showSizeChanger: this.showSizeChanger
        });
        this.needTotalList = this.initTotalList(this.columns)
        this.loadData();
    },
    methods: {
        refresh() {
            this.loadData();
        },
        loadData(pagination, filters, sorter) {

            this.localLoading = true
            var result = this.data(
                Object.assign({
                        pageNo: (pagination && pagination.current) ||
                            this.localPagination.current,
                        pageSize: (pagination && pagination.pageSize) ||
                            this.localPagination.pageSize
                    },
                    (sorter && sorter.field && {
                        sortField: sorter.field
                    }) || {},
                    (sorter && sorter.order && {
                        sortOrder: sorter.order
                    }) || {}, {
                        ...filters
                    }
                )
            );

            if (result instanceof Promise) {
                result.then(r => {
                    this.localPagination = Object.assign({}, this.localPagination, {
                        current: r.pageNo,  // 返回结果中的当前分页数
                        total: r.totalCount, // 返回结果中的总记录数
                        showSizeChanger: this.showSizeChanger,
                        pageSize: (pagination && pagination.pageSize) ||
                            this.localPagination.pageSize
                    });
                    //update--begin--autor:wangshuai-----date:20200724------for：判断showPagination是否为false------
                    (!this.showPagination || !r.totalCount && this.showPagination === 'auto') && (this.localPagination = false)
                    //update--end--autor:wangshuai-----date:20200724------for：判断showPagination是否为false-----
                    this.localDataSource = r.data; // 返回结果中的数组数据
                    this.localLoading = false
                });
            }
        },
        initTotalList(columns) {
            const totalList = []
            columns && columns instanceof Array && columns.forEach(column => {
                if (column.needTotal) {
                    totalList.push({
                        ...column,
                        total: 0
                    })
                }
            })
            return totalList
        },
        updateSelect(selectedRowKeys, selectedRows) {
            this.selectedRowKeys = selectedRowKeys
            this.selectedRows = selectedRows
            let list = this.needTotalList
            this.needTotalList = list.map(item => {
                return {
                    ...item,
                    total: selectedRows.reduce((sum, val) => {
                        let total = sum + get(val, item.dataIndex)
                        return isNaN(total) ? 0 : total
                    }, 0)
                }
            })
            // this.$emit('change', selectedRowKeys, selectedRows)
        },
        updateEdit() {
            this.selectedRows = []
        },
        onClearSelected() {
            // 【TESTA-262】页面清空后还能才做所选行，增加  this.$emit('clearAll')
            this.selectedRowKeys = []
            this.selectedRows = []
            this.updateSelect([], [])
            this.$emit('clearAll')
        },
        renderMsg(h) {
            const _vm = this
            let d = []
            // 构建 已选择
            d.push(
                h('span', {
                    style: {
                        marginRight: '12px'
                    }
                }, ['已选择 ', h('a', {
                    style: {
                        fontWeight: 600
                    }
                }, this.selectedRows.length)])
            );

            // 构建 列统计
            this.needTotalList.map(item => {
                d.push(h('span', {
                        style: {
                            marginRight: '12px'
                        }
                    },
                    [
                        `${item.title}总计 `,
                        h('a', {
                            style: {
                                fontWeight: 600
                            }
                        }, `${!item.customRender ? item.total : item.customRender(item.total)}`)
                    ]))
            });

            // 构建 清空选择
            d.push(h('a', {
                style: {
                    marginLeft: '24px'
                },
                on: {
                    click: _vm.onClearSelected
                }
            }, '清空'))

            return d
        },
        renderAlert(h) {
            return h('span', {
                slot: 'message'
            }, this.renderMsg(h))
        },
    },

    render(h) {
        const _vm = this

        let props = {},
            localKeys = Object.keys(this.$data);

        Object.keys(T.props).forEach(k => {
            let localKey = `local${k.substring(0, 1).toUpperCase()}${k.substring(1)}`;
            if (localKeys.includes(localKey)) {
                return props[k] = _vm[localKey];
            }
            return props[k] = _vm[k];
        })


        // 显示信息提示
        if (this.showAlertInfo) {

            props.rowSelection = {
                selectedRowKeys: this.selectedRowKeys,
                onChange: (selectedRowKeys, selectedRows) => {
                    _vm.updateSelect(selectedRowKeys, selectedRows)
                    _vm.$emit('onSelect', {selectedRowKeys: selectedRowKeys, selectedRows: selectedRows})
                }
            };

            return h('div', {}, [
                h("a-alert", {
                    style: {
                        marginBottom: '16px'
                    },
                    props: {
                        type: 'info',
                        showIcon: true
                    }
                }, [_vm.renderAlert(h)]),
                h("a-table", {
                    tag: "component",
                    attrs: props,
                    on: {
                        change: _vm.loadData
                    },
                    scopedSlots: this.$scopedSlots
                }, this.$slots.default)
            ]);

        }

        return h("a-table", {
            tag: "component",
            attrs: props,
            on: {
                change: _vm.loadData
            },
            scopedSlots: this.$scopedSlots
        }, this.$slots.default);

    }
};